#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <string>
// int cnt = 0;
#include <sys/wait.h>
#include <functional>
#include <vector>
using func_t = std::function<void()>;
std::vector<func_t> tasks;

void Handler(int signo)
{
    // std::cout << "get a signal, signal number is: " << signo  << " I am: " << getpid()<< std::endl;
    while (true)
    {
        pid_t rid = waitpid(-1, nullptr, WNOHANG); // 改为非阻塞
        if (rid > 0)
        {
            std::cout << "wait success, child id: " << rid << std::endl;
        }
        else if (rid == 0)
        {
            // std::cout << "等待完毕" << std::endl;
        }
        else if (rid < 0)
        {
            std::cout << "wait error" << std::endl;
            break;
        }
    }
}
int main()
{
    signal(SIGCHLD, SIG_IGN);
    for (int i = 0; i < 10; i++)
    {
        if (fork() == 0)
        {
            sleep(3);
            std::cout << "子进程退出" << std::endl;
            exit(0);
        }
        // if (fork() == 0){
        //     if (i%2 == 0){
        //         sleep(3);
        //         std::cout << "偶数子进程退出" << std::endl;
        //         exit(0);
        //     }
        //     else {
        //         sleep(10);
        //         std::cout << "奇数子进程退出" << std::endl;
        //         exit(0);
        //     }
        // }
    }
    while (true)
        ;
    return 0;
}

// void DebugPrintBlock()
// {
//     sigset_t rblock,oblock;
//     sigemptyset(&rblock);

//     sigprocmask(SIG_BLOCK,&rblock,&oblock);
//     std::cout << "Block: ";
//     for (int i = 31; i > 0; i--){
//         if (sigismember(&oblock,i)){
//             std::cout << 1;
//         }
//         else {
//             std::cout << 0;
//         }
//     }
//     std::cout << std::endl;
// }
// void DebugPrintPending()
// {
//     sigset_t pending;
//     sigpending(&pending);

//     std::cout << "pending: ";
//     for (int i = 31; i > 0; i--){
//         if (sigismember(&pending,i)){
//             std::cout << 1;
//         }
//         else {
//             std::cout << 0;
//         }
//     }
//     std::cout << std::endl;
// }
// void Handler(int signo)
// {
//     while(true){
//         std::cout << "hello wrold" << std::endl;
//         DebugPrintPending();
//         sleep(1);
//     }
// }
// int main()
// {
//     struct sigaction act,oact;
//     act.sa_flags = 0;
//     act.sa_handler = Handler;
//     sigset_t mask;
//     sigemptyset(&mask);
//     sigaddset(&mask,4);
//     sigaddset(&mask,5);
//     sigaddset(&mask,6);
//     sigaddset(&mask,7);
//     act.sa_mask = mask;
//     sigaction(2,&act,&oact);

//     while(true){
//         DebugPrintPending();
//         ::pause();
//     }

//     return 0;
// }

// int flg = 0;

// void Change(int signo)
// {
//     flg = 1;
//     std::cout << "flg 由 0 -> 1" << std::endl;
// }

// int main()
// {
//     signal(2,Change);
//     while(!flg);
//     printf("我是正常退出的!!\n");
//     return 0;
// }

// void Handler(int signo)
// {
//     std::cout << "get a signal, signal number is: " << signo << std::endl;
// }

// int main()
// {
//     // signal(2,SIG_DFL); //默认处理动作
//     signal(2,SIG_IGN); //忽略信号
//     while(true){
//         std::cout << "hello world" << std::endl;
//         sleep(1);
//     }
//     return 0;
// }
// void DebugPrint(const sigset_t &sig)
// {
//     std::cout << "pending: [";
//     for (int i = 1; i < 32; i++)
//     {
//         if (sigismember(&sig, i))
//         {
//             std::cout << 1;
//         }
//         else
//         {
//             std::cout << 0;
//         }
//     }
//     std::cout << "]" << std::endl;
// }

// int main()
// {
//     for (int i = 1; i < 32; i++)
//     {
//         signal(i, Handler);
//     }
//     sigset_t pending;
//     sigset_t rblock,oblock;
//     sigemptyset(&rblock);
//     sigaddset(&rblock,2); //把2号新号阻塞住
//     sigprocmask(SIG_SETMASK,&rblock,&oblock);

//     int cnt = 5;
//     while (true)
//     {
//         int n = sigpending(&pending);
//         DebugPrint(pending);
//         if (--cnt < 0 ){
//             //5秒之后，解除2号信号的阻塞
//             sigprocmask(SIG_SETMASK,&oblock,nullptr);
//         }
//         sleep(1);
//     }
//     return 0;
// }

// void Handler(int signo)
// {
//     std::cout << "get a signal, signal number is: " << signo << std::endl;
// }

// int main()
// {
//     // signal(11,Handler);
//     pid_t fd = fork();
//     if (fd == 0){
//         int * p = nullptr;
//         *p = 12;
//     }
//     int status = 0;
//     pid_t rid = waitpid(fd,&status,0);
//     std::cout << "exit signal: " << (status&0x7F) << "core dump : " << ((status >> 7)&1) << std::endl;
//     // int a = 10;
//     // a /= 0;
//     // while(true);
//     return 0;
// }

// void Handler(int signo)
// {
//     for (auto& t : tasks){
//         t();
//     }
//     alarm(1); //重复触发
// }

// int main()
// {
//     signal(14,Handler);
//     tasks.push_back([](){ std::cout << "我是一个下载任务" << std::endl;});
//     tasks.push_back([](){ std::cout << "我是一个网络连接任务" << std::endl;});
//     tasks.push_back([](){ std::cout << "我是一个数据处理任务" << std::endl;});

//     alarm(1);
//     while(true){
//         pause(); //等待一个信号，如果没有就阻塞住
//         std::cout << "开始执行指定的任务" << std::endl;
//     }

//     return 0;
// }
// int main()
// {
//     signal(14,Handler);
//     alarm(1);
//     while(true)
//     {
//         printf("hahahahahahahaahahahha\n");
//         cnt++;
//     }
//     return 0;
// }

// int main()
// {
//     alarm(3);
//     while(true){
//         std::cout << "hello wrold" << std::endl;
//         sleep(1);
//     }
//     return 0;
// }

// int main()
// {
//     signal(6,Handler);
//     std::cout << "hahahaahahahahaha" << std::endl;
//     std::cout << "hahahaahahahahaha" << std::endl;
//     abort();
//     return 0;
// }

// void Usage(const std::string& s){
//     std::cout << s << "+ signal number + pid ! " << std::endl;
//     exit(1);
// }

// int main(int argc,char* argv[])
// {
//     //kill 9 pid
//     if (argc != 3){
//         Usage(argv[0]);
//     }
//     int number = std::stoi(argv[1]);
//     pid_t pd = std::stoi(argv[2]);
//     kill(pd,number);
//     return 0;
// }

// void Handler(int signo)
// {
//     std::cout << "get a signal, signal number is: " << signo << std::endl;
// }

// int main()
// {
//     for (int i = 1; i < 32; i++){
//         signal(i,Handler);
//     }

//     // signal(2,Handler);
//     while(true)
//     {
//         std::cout << "hello world" << std::endl;
//         sleep(1);
//     }
//     return 0;
// }